﻿<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html lang="zh-tw">
<head>
  <link href="../perl.css" rel="stylesheet"
 type="text/css">
  <meta content="text/html; charset=UTF-8" http-equiv="content-type">
  <title>Pugs 外典之一</title>
  <meta content="Audrey Tang" name="author">
</head>
<body style="direction: ltr;">
<h1 style="text-align: left; line-height: normal;" align="left">
Pugs
外典之一<br>
<span style="font-weight: normal;">Pugs 計劃概述</span></h1>
<h2>何謂 Pugs 外典？</h2>
<p><a href="http://svn.perl.org/perl6/pugs/trunk/docs/">Pugs
外典</a>（Pugs Apocrypha）是一系列採問答體例，用以解釋 Pugs 設計及實作的文件。本外典（PA01）乃此一計劃之總要。</p>
<h2>何謂 Pugs？</h2>
<p>Pugs 始自 2005 年 2 月，是針對 Perl 6 語言進行的實作，由負責人 Audrey Tang（唐鳳）在開發團隊
（committers）與貢獻者（contributors）的襄助下，進行設計及開發。</p>
<h2>何謂 Perl 6？</h2>
<p>
<a href="http://dev.perl.org/perl6/">Perl
6</a> 是 Perl 語言的下一個主要版本，由 Larry Wall 領導的團隊負責設計。Perl
是一種語境相關、多重典範之實用程式語言。 Perl 6 團隊已表示<a
 href="http://www.nntp.perl.org/group/perl.perl6.language/19263">非常歡迎</a>
Pugs 專案的誕生。</p>
<h2>Perl 6 規範是否已經底定？</h2>
<p>截至 2004 年 12 月，Perl 6 大部份規格都已載明於一系列的<a
 href="http://dev.perl.org/perl6/synopsis/">綱要</a>（Synopses）中。雖然綱要日後可能還會
有所更動，但目前已穩定到可以實作的地步。Larry 的<a
 href="http://dev.perl.org/perl6/apocalypse/">啟示錄</a>（Apocalypse）是許多綱要的基
礎。設計團隊偶爾也會發表<a href="http://dev.perl.org/perl6/exegesis/">注疏</a>（Exegesis），
解說啟示錄的內容。Pugs 遵循綱要之內容，當有疑義時則參考啟示錄與注疏。</p>
<h2>何謂「Apocrypha」？</h2>
<p><a href="http://en.wikipedia.org/wiki/Apocrypha">Apocrypha</a>（外典）一詞源
自希臘文
&alpha;&pi;ό&kappa;&rho;&upsilon;&phi;&omicron;&sigmaf;（隱藏），代表非正統的宗教典籍。依
希臘文，單數型應為 <span style="font-style: italic;">Apocryphon</span>。</p>
<h2>外典與 Perl 6 設計文件之關係為何？</h2>
<p>啟示錄與綱要描述抽象的 Perl 6 語言規範；外典則與 Pugs 實作息息相關。如同 <a
 href="http://www.parrotcode.org/docs/pdd/">Parrot 設計文件</a>，外典也將依據 Pugs
的狀態而不時更新。<br>
</p>
<h2>Pugs 會實作完整的 Perl 6 規格嗎？</h2>
<p>會的。Pugs 將一直以最新的 Perl 6 綱要版本為實作目標。一旦有新的綱要或修訂版本出現時，Pugs 和新版不一致之處，將視為
Pugs 的瑕疵。<br>
</p>
<h2>Pugs 是自由軟體嗎？</h2>
<p>是的。Pugs 採用 GPL 第二版及 Artistic License 第 2.0b5 版釋出。Artistic 2.0
最終版本一旦底定，Pugs 即會採用。</p>
<h2>Pugs 是否受到 Perl 基金會贊助？</h2>
<p>沒有。在接受 Perl 基金會的三份專案<a
 href="http://www.perlfoundation.org/gc/grants/2003_autrijus.html">補助</a>後，
Autrijus 決定捐出自己的時間，透過 Pugs 來協助 Perl 6 專案，不向 TPF 請求贊助。</p>
<h2>如何取得 Pugs？</h2>
<p>從 <a href="http://svn.openfoundry.org/pugs/">Subversion</a> 或 <a
 href="http://wagner.elixus.org/%7Eautrijus/darcs/pugs">darcs</a>
檔案庫，可以取得最新版的 Pugs 源碼。在 CPAN 上，也會以 <a
 href="http://search.cpan.org/dist/Perl6-Pugs/">Perl6-Pugs</a>
為名定期釋出。（順帶一提，若有興趣針對 Subversion 檔案庫進行離線開發，<a
 href="http://svk.elixus.org/">svk</a> 也許對你會有幫助。祗用 svn 當然亦無不可。）<br>
</p>
<h2>如何編譯 Pugs？</h2>
<p>Pugs 採用標準 Makefile.PL 編譯系統；請見 <a style="font-family: monospace;"
 href="http://svn.openfoundry.org/pugs/README">README</a> 檔案的詳細說明。由於
Pugs 是用 Haskell 語言寫成，請先安裝 <a href="http://haskell.org/ghc/">Glasgow
Haskell
Compiler</a> (GHC) 6.4 或以上版本。請下載所屬平台的<a href="http://haskell.org/ghc/">安
裝檔</a>；從源碼編譯 GHC 得花上不少時間。</p>
<h2>何謂 Haskell？</h2>
<p><a href="http://haskell.org/">Haskell</a> 乃標準化的純粹函數式程式語言，具有惰性求值（lazy
evaluation）特性。雖然它有許多不同的實作可用，但 Pugs 採用了 GHC 特有的若干功能，因此必須用 GHC 來編譯。 </p>
<h2>GHC 又是什麼？</h2>
<p>GHC 是尖端的編譯器與互動式環境，採用 <a href="http://haskell.org/ghc/license.html">BSD
式授權</a>釋出。GHC 本身以 Haskell 寫成，能把 Haskell 編譯成位元組碼（bytecode）、C
語言程式，與某些平台的機器碼。GHC 附有完整的程式庫、為數眾多的語言延伸，以及強大的最佳化系統（藉由某 <a
 href="http://www.cse.unsw.edu.au/%7Echak/haskell/ghc/comm/the-beast/mangler.html">Perl
5 程式</a>的協助）。因此，GHC 提供了解決 Perl 6 啟動問題（bootstrapping problem）的絕佳平台。</p>
<h2>何謂 Perl 6 啟動問題？</h2>
<p>Perl 6 專案的目標是自足執行（self-hosting）：Perl 6 編譯器得用 Perl 6 本身撰寫，採用 Perl 6
Rules 來剖析 Perl 6 語法，而 Rules 又是 Perl 6 語言的一部份。此外，編譯器產出之程式碼也得包含能動態執行 Perl
6 程式碼的求值器（evaluator）。要打破此種相依循環，唯有採用其它語言先實作某些部份，然後再用 Perl 6 加以重寫。</p>
<h2>最初的啟動計劃為何？</h2>
<p>根據 <a
 href="http://search.cpan.org/dist/parrot/docs/faq.pod#Isn%27t_there_a_bootstrapping_problem?">Parrot
答客問</a>，最初的計劃是利用 Perl 5 進行啟動：先擴充 Perl 5，使其執行於 Parrot 虛擬機器上（透過 <span
 style="font-family: monospace;">B::Parrot</span> 或 <a
 href="http://www.poniecode.org/">Ponie</a>），再以 Perl 5 實作 Perl 6
編譯器，最後透過 p5-to-p6 轉換器將編譯器轉譯成 Perl 6。不過，雖然 <a
 style="font-family: monospace;"
 href="http://search.cpan.org/dist/Perl6-Rules/">Perl6::Rules</a> 確實在
Perl 5 上實作了 Rules 的雛型，但對於建構編譯器而言仍顯得不夠成熟。因此，啟動計劃轉而以 C 語言代替。</p>
<h2>修訂後的啟動計劃為何？</h2>
<p>根據一份 2005 初的<a
 href="http://www.perlfoundation.org/gc/grants/2005-p6-proposal.html">建議
書</a>，首先應採用 C 語言實作 Rules 引擎（即為 <a
 href="http://svn.perl.org/viewcvs/parrot/trunk/compilers/pge/">PGE</a>），
用它將 Perl 6 剖析成 Parrot 的<a
 href="http://en.wikipedia.org/wiki/Abstract_syntax_tree">抽象語法樹</a>（AST），
接著在 Parrot 裡實作 AST 求值器。Ponie 和 p5-to-p6 仍在進行中，但已非啟動程序中的關鍵成份。</p>
<h2>Pugs 能如何協助 Perl 6 啟動？</h2>
<p>在啟動程序中，常存在許多瓶頸，使得許多依賴這些瓶頸的工作無法推展。好比說，沒有可用的 Perl 6 實作，就難以為 Perl 6
撰寫單元測試與標準程式庫；在缺少 AST 介面的情況下，也沒辦法撰寫 AST 求值器。Pugs
為此程序的各層面提供可用的替代元件，因此解決了上述的困境。</p>
<h2>Pugs 有助於 Perl 6 語言設計嗎？</h2>
<p>在缺少可用的實作時，很難看出規格內的不一致與例外狀況。然而，假如在實作許久之後，纔發現設計上的瑕疵，可能就得在重新架構上耗費許多心力。藉由
提供可用的 Perl 6 實作，Pugs 可做為先期的確認平台；這樣不但能趁早解決問題，也可以鼓勵更多人運用 Perl 6 的特性。</p>
<h2>為何選擇 Haskell？</h2>
<p>Haskell 具有許多與 Perl 6 特點相應的功能：Perl 6 Rules 與 <a
 href="http://www.cs.uu.nl/%7Edaan/download/parsec/parsec.html">Parsec</a>
十分相似；兩種語言裡都有惰性串列求值；延續函式（continuation）則可利用 <a
 href="http://www.nomaware.com/monads/html/contmonad.html">ContT</a>
單子轉換器（monad transformer）來建構。這讓雛型開發工作簡化許多：首支可用的直譯器只花了<a
 href="http://use.perl.org/%7Eautrijus/journal/23051">一星期</a>便釋出了，在<a
 href="http://use.perl.org/%7Eautrijus/journal/23335">第三個星期</a>時，我們已經有了可
供單元測試的全功能 <a style="font-family: monospace;"
 href="http://svn.openfoundry.org/pugs/ext/Test/lib/Test.pm">Test.pm</a>
模組。</p>
<h2>Pugs 是編譯器還是直譯器？</h2>
<p>和 Perl 5 相似，Pugs 先把 Perl 6 程式編譯成 AST，然後再用內建的求值器加以執行。不過，未來 Pugs
可能會提供支援多種編譯器後端的編譯器介面。<br>
</p>
<h2>考慮納入哪些編譯器後端呢？</h2>
<p>如果要實作編譯器的話，首先很可能會是產出 Perl 6 程式碼，類似 <a
 style="font-family: monospace;"
 href="http://search.cpan.org/dist/perl/ext/B/B/Deparse.pm">B::Deparse</a>
模組的編譯器後端。接下來則可能產出 Haskell 程式碼，並交由 GHC 編譯成 C 語言。屆時，下一個目標很可能是 <a
 href="http://svn.perl.org/viewcvs/parrot/trunk/compilers/ast/">Parrot
AST</a> 介面。如果有人願意協助的話，我們也可能再加入其它後端（譬如 Perl 5 bytecode）。</p>
<h2>預定的 Pugs 開發計劃為何？</h2>
<p>Pugs 之主要/次要版本號將逼近 2*&pi;；次版本號中的各小數位皆代表一項里程碑。版本號的第三位數會在每次釋出時遞增。目前的里程碑
為：</p>
<ul>
  <li>6.0: 首次釋出</li>
  <li>6.2: 基本輸出入與流程控制元件、可覆寫變數（mutable variables）與賦值（assignment）。</li>
  <li>6.28: 類別（classes）與特質（traits）。</li>
  <li>6.283: 規則（rules）與文法（grammars）。</li>
  <li>6.2831: 型別系統（type system）與鏈結（linking）。</li>
  <li>6.28318: 巨集（macros）。</li>
  <li>6.283185: 如有必要，將 Pugs 移植至 Perl 6。</li>
</ul>
<h2>Pugs 的可攜性如何？</h2>
<p>Pugs 可在 Win32、Linux 與多種 Unix 系統上執行。GHC 的<a
 href="http://haskell.org/ghc/contributors.html">移植者名單</a>與<a
 href="http://haskell.org/ghc/download_ghc_622.html">下載網頁</a>有詳細的資訊。從
6.2.0 開始，Pugs 團隊也會提供若干平台的安裝檔。</p>
<h2>Pugs 的速度是否夠快？</h2>
<p>在 Parsec 的強力支援下，Pugs 的解譯器很快。不過 Pugs 的求值器目前尚未最佳化：在一般 PC 上每秒約處理 1000
個運算符，大約比 Perl 5 慢上 100 倍。這對實現雛型語言功能來說，已經夠快了；假如還不能滿足你的需要，請考慮幫忙開發編譯器後端。</p>
<h2>有 Perl 6 模組的 CPAN 嗎？</h2>
<p>沒有。當前發佈 Perl 6/Pugs 模組較好的方式，是交由 openfoundry.org 的提交者，將你的模組放到 Pugs 原始碼檔案庫下的 modules/ 目錄。最好能同時提供該模組的測試案例，讓我們對該模組多些了解。</p>

<p>但情況也不是就那麼糟。假如你夠耐心，可以等候 <span style="font-family: monospace;">Pugs::MakeMaker</span> 和 <span style="font-family: monospace;">Module::Install::Pugs</span> 的出現。等到以上模組出現在 CPAN 上，表示我們已經解決了散佈上的問題。你就可以開始把東西丟上 CPAN 了。當然，隨時歡迎各方提供其它意見。
</p>
<h2>Pugs 能與 Perl 5 程式庫共用嗎？</h2>
<p>雖然目前還不行，但我們未來可能會照 Autrijus 之前實作 <a style="font-family: monospace;"
 href="http://search.cpan.org/dist/Inline-MzScheme/">Inline::MzScheme</a>
的方式，撰寫 <span style="font-family: monospace;">Inline::GHC</span> 模組，讓
Perl 5 與 Haskell 模組能相互溝通。如果成功的話，架一個 <span
 style="font-family: monospace;">Inline::Pugs</span>
在上面也非難事。不然，我們也可能寫個產出 Pugs AST 碼的 Perl 5 程式碼解譯器，讓 Pugs 能執行純以 Perl
寫成的模組。再不然，也可以把 Pugs AST 編成 Perl 5 的 AST，不過這更是純屬臆測。</p>
<h2>Pugs 能與 Haskell 程式庫共用嗎？</h2>
<p>目前你可以把 Haskell 程式庫靜態鏈接至 Pugs 的內建函式，祗需修改 <a
 style="font-family: monospace;"
 href="http://svn.openfoundry.org/pugs/src/Pugs/Prim.hs">Prim.hs</a>
內的幾列程式碼即
可。我們正考慮撰寫 <a href="http://www.cse.unsw.edu.au/%7Edons/hs-plugins/">hs-plugins</a>
的簡易界面，讓 Pugs 能動態載入 Hasekll 程式庫，甚至在 Perl 6 中內嵌 Haskell 程式碼。</p>
<h2>Pugs 能與 C 程式庫共用嗎？</h2>
<p>還不行。不過 <a href="http://www.haskell.org/hdirect/">HaskellDirect</a>
配上前述的 hs-plugins，似乎會是與 C、CORBA 及 COM 程式庫溝通的簡單方式。</p>
<h2>我會 Perl 5，不懂 Haskell。我能幫 Pugs 的忙嗎？</h2>
<p>當然！Pugs 的標準程式庫與單元測試都是以 Perl 6 寫成的，而我們總是需要更多的測試和程式庫。這方面的工作只需要懂 Perl
5，再花上幾分鐘熟悉少部份語法的不同之處即可。當然，過程中你也可能會學到一些 Haskell 相關的知識。</p>
<h2>我會 Haskell，但不懂 Perl 5。我可以幫忙嗎？</h2>
<p>當然！Perl 6 和 Haskell 有很多相似之處，好比說依據型別分派的函式（type-based function
dispatch）、以函式為值（first class
functions），以及局部套用函式（currying）等等；因此，要了解語法也會簡單許多。總是有許多功能的待辦測試等著實作，不用怕找不到事情
做。</p>
<h2>我會一點 Perl 6。我能用 Pugs 做什麼？</h2>
<p>先看看 examples/ 目錄裡的範例程式。已經有人用 Pugs 寫了網站應用軟體與報表系統。假若你發現 Pugs
有不足之處，請告訴我們，以便實作。</p>
<h2>哪裡可以學 Haskell？</h2>
<p><a href="http://www.haskell.org/">Haskell 首頁</a>和 <a
 href="http://haskell.org/hawiki/">Wiki</a> 會是不錯的開始。有許多線上教學文件可看；<a
 href="http://www.isi.edu/%7Ehdaume/htut/">Yet Another
Haskell Tutorial</a> 可能是其中最容易上手的。由於 Pugs 中大量應用單子轉換器 （monad
transformer），建議讀讀 <a href="http://www.nomaware.com/monads/html/">All
About
Monads</a>。書的話，<a
 href="http://www.iro.umontreal.ca/%7Elapalme/Algorithms-functional.html">Algorithms:
A Functional Programming Approach</a>、<a
 href="http://www.cs.kent.ac.uk/people/staff/sjt/craft2e/">Haskell:
The Craft of
Functional Programming</a> 和 <a href="http://haskell.org/soe/">The
Haskell School of
Expression</a> 都是很好的入門讀物。此外，<a href="http://freenode.net/">freenode</a>
的 <span style="font-family: monospace;">#haskell</span> 頻道上有許多熱愛
Haskell 的人可以幫忙。</p>
<h2>哪裡學得到 Perl 6？</h2>
<p><a href="http://dev.perl.org/perl6/">Perl
6 首頁</a>有許多線上文件。每隔一兩個星期，<a href="http://www.perl.com/">Perl.com</a>
上會有新的 Perl 6 通信論壇摘要，想趕上 Perl 6 的開發進度者一定不能錯過。在書藉方面，<a
 href="http://www.oreilly.com/catalog/059600737X/">Perl
6 and Parrot Essentials</a> 和 <a
 href="http://www.apress.com/book/bookDisplay.html?bID=355">Perl
6 Now</a> 都很有幫助。</p>
<h2>要如何學習實作程式語言？</h2>
<p><a href="http://www.cis.upenn.edu/%7Ebcpierce/tapl/">Types
and Programming Languages</a> 一定要讀。Pugs 最初是 Autrijus
在自學此書時的習作；它在實作期間也一直是重要的指南。它的續集 <span
 style="text-decoration: underline;"></span><a
 href="http://www.cis.upenn.edu/%7Ebcpierce/attapl/">Advanced
Topics in
Types and Programming Languages</a> 同樣十分重要。熟悉其它多重典範語言（如 <a
 href="http://www.mozart-oz.org/">Mozart/Oz</a>、<a
 href="http://www.informatik.uni-kiel.de/%7Emh/curry/">Curry</a> 、<a
 href="http://www.ocaml.org/">O&rsquo;Caml</a> 等）可能也有幫助。此外，<a
 href="http://www.cse.unsw.edu.au/%7Echak/haskell/ghc/comm/">GHC
commentary</a> 為 GHC 實作提供了詳實的描述。</p>
<h2>我想幫忙，該怎麼做？</h2>
<p>首先，發一封空白信到 <a href="mailto:perl6-compiler-subscribe@perl.org">perl6-compiler-subscribe@perl.org</a>，
訂閱 <a href="http://nntp.perl.org/group/perl.perl6.compiler">perl6-compiler</a>
通信論壇。接著加入 <a href="http://freenode.net/">irc.freenode.net</a> 的 <span
 style="font-family: monospace;">#perl6</span> IRC 頻道，看看有什麼待辦事項；不妨與 <span
 style="font-family: monospace;">#perl6</span> 上的 Pugs 團隊連繫，以加入開發團隊。咱們
IRC 上見！<br>
<o:p></o:p></p>
</body>
</html>
